﻿#include"hstring.h"
class Role {
public:
	int hp;
	int mp;

	Role& operator=(const Role& role) {//编译器默认添加关于=的运算符构造函数，这是默认生成的函数
		hp = role.hp;
		mp = role.mp;
		return *this;
	}
	Role& operator=(const Role& role) {//可以自己添加该函数，并修改
		hp = role.hp / 2;
		mp = role.mp / 2;
		return *this;
	}
	Role& operator=(const Role& role) = delete;//删除运算符重载
	Role& operator=(const Role& role);
};
//Role& operator=(const Role& role);//报错，该函数必须是成员函数
Role& Role::operator=(const Role& role) {//函数类型写为void的话会让结果赋值其他对象时失败
	hp = role.hp / 2;
	mp = role.mp / 2;
	return *this;
}

int main() {
	Role x, y, z;
	x.hp = 100;
	x.mp = 200;
	y = x;//Role& operator=(const Role& role)
	z = y = x;//z.operator=(y.operator=(x))
	std::cout << y.hp << "///////////" << y.mp << std::endl;

	char strA[]{ "aaaaaabbbbbbbbcccccccc" };

	hstring str{ strA };//使用副本构造函数
	hstring str1{ str };
	hstring str2{ "hello!" };

	strA[0] = 0;//赋值为0后，因为\0表示ASCII码值为0的字符，所以那个位置的内容变成\0，因此后面的内容消失
	std::cout << str.c_str() << std::endl;//对于cstr = (char*)str，因为str的字符串不是自己的，是strA的，所以当strA改变，str的字符串也会改变

	str1 = str2;
	std::cout << str1.c_str() << std::endl;//hello!

	str1 = "12414";//不需要对于char重载=运算符，因为会使用hstring::hstring(const char* str)构造函数临时构造对象，然后传递进来，也就是完成了一次类型转换
	std::cout << str1.c_str() << std::endl;//12414

	str1 = 103456789;
	std::cout << str1.c_str() << std::endl;//12414


}